--- title: "L1-028 判断素数" created: 2025-11-28 tags: - 算法 --- # L1-028 判断素数 ## 题目 [L1-028 判断素数](https://pintia.cn/problem-sets/994805046380707840/exam/problems/type/7?problemSetProblemId=994805106325700608&page=0) ![[image-2c562ab5.png]] ## 思路分析 基础质数 ### 判断质数 合数成对出现 只需判断前半段 使用i≤n/i 效率高于sqrt(n) 避免出现i\*i≤n的越界危险 ```cpp bool is_prime(int n){ if(n < 2) return false; for(int i = 2;i <= n / i;i ++){ if(n % i == 0){ return false; } } return true; } ``` ### 筛法 ```cpp 埃氏筛 从2开始 把所有质数的倍数都筛掉 没被筛的就是质数 保存起来 void get_primes(){ for(int i=2;i<=n;i++){ if(!st[i]){ //可以用质数就把所有的合数都筛掉; primes[cnt++]=i; for(int j=i;j<=n;j+=i) st[j]=true; } } } //用set方便些 set primes; void get_primes(int n){ for(int i=2;i<=n;i++){ if(!isnot_prime[i]){ primes.insert(i); for(int j=i;j<=n;j+=i) isnot_prime[j]=true; } } } 线性筛 只需要用最小的质因数进行筛除 注意避免重复标记if(i%primes[j]==0) 10^7用线性筛 void get_primes(){ for(int i=2;i<=n;i++){ if(!st[i]) primes[cnt++]=i; for(int j=0;primes[j]<=n/i;j++){ st[primes[j]*i]=true; if(i%primes[j]==0) break; } } } ``` ## 代码实现 ```cpp #include using namespace std; #define endl '\n' #define int long long using ll = long long; using ull = unsigned long long; using PII = pair; using Pll = pair; int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1}; const int inf=0x3f3f3f3f; bool is_prime(int n){ if(n<2) return false; for(int i=2;i<=n/i;i++){ if(n%i==0) return false; } return true; } //const int N=1000010; //set primes; //bool isnot_prime[N]; //void get_primes(int n){ // for(int i=2;i<=n;i++){ // if(!isnot_prime[i]){ // primes.insert(i); // for(int j=i;j<=n;j+=i){ // isnot_prime[j]=true; // } // } // } //} signed main(){ ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); int n;cin>>n; // get_primes(N); while(n--){ int tmp;cin>>tmp; if(is_prime(tmp)) cout<<"Yes"<